#include "ClaveRSA.h"

namespace Encriptacion {

ClaveRSA::ClaveRSA(string nombreDeAdmin, Encriptacion::TipoDeClaveRSA tipoDeClave) {

	this->nombreDeAdmin = nombreDeAdmin;
	this->tipoDeClave = tipoDeClave;

	string pathDeLaClave = this->obtenerPathDeLaClave();

	// abro el archivo segun el path para obtener la clave
	fstream archivo;
	archivo.open(pathDeLaClave.c_str(), ios::out | ios::in);

	if (archivo.bad()) {
		archivo.open(pathDeLaClave.c_str(), ios::in | ios::out);
	}

	archivo.read((char*) &(this->potencia), sizeof(long long));
	archivo.read((char*) &(this->modulo), sizeof(long long));

	archivo.close();
}

ClaveRSA::ClaveRSA(string nombreDelAdmin, Encriptacion::TipoDeClaveRSA tipoDeClave, unsigned long long potencia,
		unsigned long long modulo) {

	this->nombreDeAdmin = nombreDelAdmin;
	this->tipoDeClave = tipoDeClave;
	this->potencia = potencia;
	this->modulo = modulo;
}

unsigned long long ClaveRSA::getTamanioDeLosBloques() {

	return this->modulo;
}

unsigned long long ClaveRSA::getPotencia() {

	return this->potencia;
}

unsigned long long ClaveRSA::getModulo() {

	return this->modulo;
}

string ClaveRSA::getNombreAdmin(){
	return this->nombreDeAdmin;
}

void ClaveRSA::guardarClave() {

	string pathDeLaClave = this->obtenerPathDeLaClave();
	fstream archivo;
	archivo.open(pathDeLaClave.c_str(), ios::out | ios::trunc);

	archivo.write((char*) &(this->potencia), sizeof(long long));
	archivo.write((char*) &(this->modulo), sizeof(long long));

	archivo.close();
}

string ClaveRSA::obtenerPathDeLaClave() {

	Configuracion* config = Configuracion::getInstancia();
	string nombreDelArchivo = "";

	if (this->tipoDeClave == Encriptacion::Privada)
		nombreDelArchivo = "ClavePrivada";
	else
		nombreDelArchivo = "ClavePublica";

	return config->getPathAdministradores() + this->nombreDeAdmin + "/Claves/" + nombreDelArchivo + ".bin";

}

ClaveRSA::~ClaveRSA() {
}

}
